package com.ruoyi.common.core.service;

import com.ruoyi.common.exception.base.domian.EntityNotFoundException;
import com.ruoyi.common.exception.base.manipulation.DeleteDataException;
import com.ruoyi.common.exception.base.manipulation.InsertDataException;
import com.ruoyi.common.exception.base.manipulation.UpdateDataException;
import com.ruoyi.common.utils.StringUtils;

/**
 * @Classname IServiceException
 * @Author: sunluquan
 * @Date: 2022/5/9 15:49
 * @Description TODO
 */
public interface IServiceException {

    /**
     * 新增失败抛出的异常
     * @param <T>
     * @return
     */
    default <T extends InsertDataException> T insertException(){
        return (T) new InsertDataException();
    }

    /**
     * 修改失败抛出的异常
     * @param <T>
     * @return
     */
    default <T extends UpdateDataException> T updateException(){
        return (T) new UpdateDataException();
    }

    /**
     * 删除失败抛出的异常
     * @param <T>
     * @return
     */
    default <T extends DeleteDataException> T  deleteException(){
        return (T) new DeleteDataException();
    }

    /**
     * 查询失败抛出异常
     * @param <T>
     * @return
     */
    default <T extends EntityNotFoundException> T selectException(){
        return (T)new EntityNotFoundException();
    }

    /**
     * 新增失败抛出的异常
     * @param throwEx 是否抛出相关异常
     */
    default void checkForInsert(boolean throwEx){
        if(throwEx){
            throw insertException();
        }
    }

    /**
     * 修改失败抛出的异常
     * @param throwEx 是否抛出相关异常
     */
    default void checkForUpdate(boolean throwEx){
        if(throwEx) {
            throw updateException();
        }
    }

    /**
     * 删除失败抛出的异常
     * @param throwEx 是否抛出相关异常
     */
    default void  checkForDelete(boolean throwEx){
        if(throwEx){
            throw deleteException();
        }
    }

    /**
     * 数据未找到异常
     * @param data 当前数据是否为空
     */
    default void checkForSelect(Object data){

        if(StringUtils.isNull(data)){
//                || (data instanceof Collection && StringUtils.isEmpty((Collection)data))
//                || (data instanceof Map && StringUtils.isEmpty((Collection)data))){

            throw selectException();

        }
    }

}
